package cc.mrbird.febs.common.utils;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;

/**
 * MD5加密工具类
 * 基于Shiro的SimpleHash实现MD5加密
 * 支持密码单独加密和用户名密码组合加密
 * 使用迭代加密增加安全性
 * 
 * @author MrBird
 */
public class MD5Util {

	/**
	 * 私有构造函数，防止实例化
	 */
	protected MD5Util() {
	}

	/**
	 * 加密算法名称
	 */
	private static final String ALGORITH_NAME = "md5";

	/**
	 * 加密迭代次数
	 * 增加迭代次数可以提高安全性，但也会增加计算开销
	 */
	private static final int HASH_ITERATIONS = 2;

	/**
	 * 对密码进行MD5加密
	 * 使用密码本身作为盐值，进行两次迭代加密
	 *
	 * @param password 待加密的密码
	 * @return 加密后的十六进制字符串
	 */
	public static String encrypt(String password) {
		return new SimpleHash(ALGORITH_NAME, password, ByteSource.Util.bytes(password), HASH_ITERATIONS).toHex();
	}

	/**
	 * 使用用户名和密码进行组合加密
	 * 将用户名（转小写）和密码组合作为盐值，进行两次迭代加密
	 * 这种方式可以防止相同密码在不同用户下产生相同的加密结果
	 *
	 * @param username 用户名
	 * @param password 密码
	 * @return 加密后的十六进制字符串
	 */
	public static String encrypt(String username, String password) {
		return new SimpleHash(ALGORITH_NAME, password, ByteSource.Util.bytes(username.toLowerCase() + password),
				HASH_ITERATIONS).toHex();
	}

	/**
	 * 测试方法
	 * 用于演示加密功能的使用
	 *
	 * @param args 命令行参数
	 */
	public static void main(String[] args) {
		System.out.println(encrypt("mrbird","1234qwer"));
	}

}
